package cn.doitedu.day04;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MyListTest {

    public static void main(String[] args) {

        //自己定义一个MyList，这个List中，有map、flatMap、filter、reduce方法
        //并且自己写代码实现具体的功能

        List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5);
        //对原来的List添加一个map方法
        //1.继承或实现接口
        //2.装饰模式（对原来的List包一层）
        //使用包装的方式
        MyList myList = new MyList(lst);
        //map方法传入的参数是什么？

        //在scala中类似的用法
        //val f = (x: Int) => x * 10
        //arr.map(f)
        //arr.map(x => x * 10)
        //arr.map(new Function1[Int, Int]{ apply(x: Int) = x * 10})

        List<Integer> nList = myList.map(new MapFunction() {
            @Override
            public Integer invoke(Integer in) {
                return in * 10;
            }
        });

        //引用类型
        MapFunction mapFunction = new MapFunction() {
            @Override
            public Integer invoke(Integer in) {
                return in * 10;
            }
        };

        List<Integer> nList2 = myList.map(mapFunction);

        //java8中可以将匿名内部类进行简化，使用Lambda表达式
        List<Integer> nList3 = myList.map(in -> in * 10);

        //----------------------
        //添加一个filter方法，filter方法中可以指定过滤逻辑
        List<Integer> nList4 = myList.filter(in -> in >= 2);

        //使用Java8的Stream和Lambda表达式
        List<Integer> nList5 = lst.stream()
                .filter(in -> in % 2 == 0)
                .map(i -> i * 10)
                .collect(Collectors.toList());

        for (Integer r : nList5) {
            System.out.println(r);
        }
    }
}
